"""
深浅拷贝需要记住四句话
    1. 所谓的深浅拷贝，拷贝的多还是拷贝的少，。浅拷贝拷贝的少，深拷贝拷贝的多
    2. 深浅拷贝都是既可以操作可变类型，也可以操作不可变类型，但是面试题中，几乎操作都是可变类型
    3. 所谓的深浅拷贝指的是 copy模块的两个函数
        浅拷贝 ：copy.copy()
        深拷贝： copy.deepcopy()
    4. 深浅拷贝操作不可变类型时，效果和普通赋值效果一样
       深浅拷贝操作不可变类型时，浅拷贝只拷贝第一层，深拷贝是只要某层还是可变类型，就一直拷贝下去
"""
import copy


# 演示浅拷贝可变类型： 浅拷贝只拷贝第一层，
def func_shallow1():
    a = [1,2,3]
    b = [11,12,13]
    c = [6,7,a,b]

    # 测试id(c) 和 id(d)
    d = copy.copy(c)  # 浅拷贝，只把c的第一层数据拷贝给d ,其他数据不拷贝
    print('id(c)------>',id(c))
    print('id(d)------>', id(d))

    # 测试2
    print(id(c[2])) # a的地址
    print(id(a))
    print(id(d[2])) # a的地址

    # 修改a[2] = 22
    a[2] = 22
    print('c-->',c) # [6, 7, [1, 2, 22], [11, 12, 13]]
    print('d-->',d) # [6, 7, [1, 2, 22], [11, 12, 13]]


# 浅拷贝拷贝不可变类型 不会给拷贝对象d单独的开辟新的内存控制，只是将c的地址拷贝了过来
def func_shallow2():
    a = (1,2,3)
    b = (11,12,13)
    c = (6,7,a,b)

    d = copy.copy(c)

    print('id(c)------>',id(c)) # 地址一样
    print('id(d)------>', id(d))


if __name__ == '__main__':
    # func_shallow1()
    func_shallow2()